【レポート】Amazon ECS deployment circuit breaker を使った自動ロールバック #AWSSummit
CX事業本部@大阪の岩田です。この記事はDeveloper Zoneのセッション「Amazon ECS deployment circuit breaker を使った自動ロールバック」のレポートとなります。ECSのデプロイまわりに興味のある方は是非セッションのURLからデモをご視聴下さい。
セッション概要
ECS デプロイ時、起動に成功しない ECS サービス配下のタスク群を自動でロールバックさせるための設定や実際のロールバックの様子をご覧いただきます。
スピーカー
アマゾン ウェブ サービス ジャパン株式会社 アカウントソリューションアーキテクト 竹本 将気氏
URL
Amazon ECS deployment circuit breaker を使った自動ロールバック
セッション内容
Amazon ECS deployment circuit breakerとは
- ECSサービスのデプロイで異常が発生した場合に、以前にデプロイが成功していたバージョンに自動でロールバックする機能
- rolling updateデプロイタイプでサポートされる
- もともとrolling updateのデプロイには失敗というステータスが無かったので、デプロイに異常があった場合にECSサービスがタスクの起動を繰り返すという問題があった
- コンピューティングリソースとコストが無駄
- ECSサービスをCloud Formationで管理している場合にCloud Formationのスタックが「詰まる」という状況が発生していた
- ECSを利用できる全リージョンで利用可能
Amazon ECS deployment circuit breakerの仕組み
- 2つのステージでデプロイを評価する
- ステージ1
- タスクがRUNNING状態に遷移することなく停止した数を確認
- タスク定義で指定したコンテナイメージのURLが間違っている場合など、コンテナが実行できないような状況ではRUNNING状態に遷移することなく停止する
- このような状況ではdeployment circuit breakerが対象のデプロイをFAILEDとしてマークする
- ステージ2
- RUNNING状態に遷移したタスクがヘルスチェックに合格した数を確認
- アプリにバグが含まれていたため、ヘルスチェックのエンドポイントがエラーを返すような場合
- ステージ1,2両方が成功した場合のみdeployment circuit breakerは対象デプロイをCOMPLETEDとしてマークする
デプロイ失敗判定のしきい値
- 10 <= Desired Count * 0.5 <= 200
- 最小は10、最大は200
- 今のところしきい値の変更には未対応
ECS deployment circuit breakerの設定方法
- 新規のECSサービス、既存のECSサービスどちらにも設定可能
- AWS CLI、マネコン以外にCloud Formationにも対応
デモ
- 既存のECSサービスに対してAWS CLIからdeployment circuit breakerを適用するデモ
- ALBとFargateで構成されるシンプルなアプリ
- ALB配下でver1のタスク定義が稼働している環境に対してタスク定義の更新を行う
デモ1(ステージ1でロールバック)
- ステージ1でロールバックするパターン
- タスク定義ver2のデプロイを試行
- このバージョンはDockerfileの
CMD
にexit 2
を指定 - 必ず起動に失敗するコンテナ
- タスクの起動に10回失敗するとFAILEDとしてマークされる
- このバージョンはDockerfileの
- 最終的にver2のタスク定義から起動したタスクは全て削除される
デモ2(ステージ2でロールバック)
- ステージ2でロールバックするパターン
- タスクは起動したがヘルスチェックに失敗するパターン
- タスク定義ver3のデプロイを試行
- このバージョンはヘルスチェック用のパス
/health
に対するレスポンスとして、常に500エラーを応答する
- このバージョンはヘルスチェック用のパス
- タスクは正常に起動するので、一度RUNNING状態へ遷移する
- ALBからのヘルスチェックに失敗し、FAILEDに遷移する
デモ3(正常系)
- 正常系のパターン
- タスク定義ver4のデプロイを試行
- タスクの起動、ヘルスチェック共に成功するパターン
- タスクのステータスはCOMPLETEDに遷移し、デプロイしたver4のタスク定義にもALBからのリクエストが流れるようになる
- 徐々にローリングアップデートが完了し、最終的にはver1のタスク定義が全てver4に置き換わる
所感
私は元々サーバーレス開発部という部署に所属していたこともあり、クラスメソッドに入社してからアプリケーションの実行基盤としてLambdaばかり触っていたのですが最近はECSを触る機会も増えてきたので、ECS周りについても復習しているところです。そんな中でこちらのセッションはECS deployment circuit breakerについて20分程度でサクっと学べる良いセッションでした。やはりデモがあると理解が進みやすいですね。ECS deployment circuit breakerの基礎を抑えたい方はこちらのセッションの視聴をオススメします!